package com.example.designpattern.creational.prototype;

public class User {

    private MilkTea order() throws CloneNotSupportedException {

//        MilkTea milkTeaOfJay = new MilkTea();
//        milkTeaOfJay.type = "原味";
//        milkTeaOfJay.ice = false;
//
//        MilkTea yourMilkTea = milkTeaOfJay;

        // 好像没什么问题，将周杰伦的奶茶直接赋值到你的奶茶上就行了，看起来我们并不需要 clone 方法。但是这样真的是复制了一份奶茶吗？
        //
        //当然不是，Java 对非基本类型对象的赋值只是传递地址。这样赋值之后，yourMilkTea 仍然指向的周杰伦的奶茶，并不会多一份一样的奶茶。
        //
        //那么我们要怎么做才能点一份一样的奶茶呢？将程序修改如下就可以了：

//        MilkTea milkTeaOfJay = new MilkTea();
//        milkTeaOfJay.type = "原味";
//        // 不加冰
//        milkTeaOfJay.ice = false;
//
//        MilkTea yourMilkTea = new MilkTea();
//        yourMilkTea.type = "原味";
//        yourMilkTea.ice = false;


        // 只有这样，yourMilkTea 才是 new 出来的一份全新的奶茶。我们设想一下，如果有一千个粉丝都需要点和周杰伦一样的奶茶的话，按照现在的写法就需要 new 一千次，并为每一个新的对象赋值一千次，造成大量的重复。
        //
        //更糟糕的是，如果周杰伦临时决定加个冰，那么粉丝们的奶茶配置也要跟着修改：
        //    MilkTea milkTeaOfJay = new MilkTea();
        //    milkTeaOfJay.type = "原味";
        //    milkTeaOfJay.ice = true;
        //
        //    MilkTea yourMilkTea = new MilkTea();
        //    yourMilkTea.type = "原味";
        //    yourMilkTea.ice = true;
        //
        //    // 将一千个粉丝的 ice 都修改为 true
        //    ...
        //

        // 大批量的修改无疑是非常丑陋的做法，这就是我们需要 clone 方法的理由！
        //
        // 运用原型模式，在 MilkTea 中新增 clone 方法：

        MilkTea milkTeaOfJay = new MilkTea();
        milkTeaOfJay.type = "原味";
        milkTeaOfJay.ice = false;

        MilkTea yourMilkTea = milkTeaOfJay.clone();

        // 一千位粉丝都调用 milkTeaOfJay 的 clone 方法即可
        // ...

        // 这就是原型模式，Java 中有一个语法糖，让我们并不需要手写 clone 方法。
        // 这个语法糖就是 Cloneable 接口，我们只要让需要拷贝的类实现此接口即可。
        //

        return yourMilkTea;

    }

    private void show(MilkTea milkTea) {
        String pearl;
        if (milkTea.isPearl())
            pearl = "加珍珠";
        else
            pearl = "不加珍珠";
        String ice;
        if (milkTea.isIce()) {
            ice = "加冰";
        } else {
            ice = "不加冰";
        }
        System.out.println("一份" + milkTea.getSize() + "、"
                + pearl + "、"
                + ice + "的"
                + milkTea.getType() + "奶茶");
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        User user = new User();
        user.show(user.order());
    }

}
